package com.fengye.api.config;

import com.fengye.common.interceptor.LoginInterceptor;
import com.fengye.common.resolver.MyHandlerMethodArgumentResolver;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.method.support.HandlerMethodArgumentResolver;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

import java.util.List;

/**
 * @author sunlei
 * @version 1.0
 * @date 2023/12/13 14:51:30
 * @description WebMvcConfig配置，
 * 【注意】在@Configuration注解的类中通过@Autowired注入bean，可能会遇到问题，
 * 推荐采用构造方法、@bean方式注入 <a href="https://blog.csdn.net/m0_52934670/article/details/121288133">...</a>
 */
@Configuration
public class MyWebMvcConfigurer implements WebMvcConfigurer {
    @Bean
    public LoginInterceptor loginInterceptor() {
        return new LoginInterceptor();
    }

    @Bean
    public MyHandlerMethodArgumentResolver myHandlerMethodArgumentResolver() {
        return new MyHandlerMethodArgumentResolver();
    }

    /**
     * 配置拦截器
     * @param registry 拦截器登记对象
     */
    @Override
    public void addInterceptors(InterceptorRegistry registry) {

       // 这里不采用拦截器，使用SpringSecurity来认证授权，先注释掉
       // registry.addInterceptor(loginInterceptor())//添加拦截器
       //         .addPathPatterns("/**")  //配置拦截路径
       //         .excludePathPatterns("/user/login", "/user/reg", "/user/captcha") // 接口白名单
       //         .excludePathPatterns("/swagger-ui/**", "/swagger-resources/**", "/v3/**", "/actuator/**", "/monitor/**") // swagger、actuactor
       //         .excludePathPatterns("/**/*.css","/**/*.js","/**/*.html","/images/**", "/bootstrap3/**");//配置排除路径


        /*
        如果有多个拦截器，形如下面配置，拦截器的拦截顺序，是按照配置文件中注入拦截器的顺序执行的

        registry.addInterceptor(拦截器1)
                .addPathPatterns("/**")
                .excludePathPatterns("/sys_user/login");

        registry.addInterceptor(拦截器2)
                .addPathPatterns("/**")
                .excludePathPatterns("/sys_user/login");
         */
    }

    /**
     * 配置参数解析器
     * @param resolvers 解析器
     */
    @Override
    public void addArgumentResolvers(List<HandlerMethodArgumentResolver> resolvers) {
        resolvers.add(myHandlerMethodArgumentResolver());
    }

    /**
     * 配置跨域
     * @param registry 跨域登记对象
     */
    @Override
    public void addCorsMappings(CorsRegistry registry) {
        // 设置允许跨域的路径
        registry.addMapping("/**")
                // 设置允许跨域请求的域名
                .allowedOriginPatterns("*")
                // 是否允许cookie
                .allowCredentials(true)
                // 设置允许的请求方式
                .allowedMethods("GET", "POST", "DELETE", "PUT")
                // 设置允许的header属性
                .allowedHeaders("*")
                // 跨域允许时间
                .maxAge(3600);
    }
}
